<script>
  import Vue from 'vue'
  import store from './store/index.js'
  import updateCustomBarInfo from './tuniao-ui/libs/function/updateCustomBarInfo.js'
  import { checkLoginStatus, globalAutoLogin } from './utils/auth.js'
  import { generateUUID } from './utils/common.js'
  import webSocketManager from './utils/websocket.js'
  
	export default {
		globalData: {
			// 全局数据
		},
		onLaunch: function() {
			console.log('App Launch');
			
			// 初始化平台类型
			this.$store.dispatch('app/initPlatformType');

			// 隐藏原生tabbar
			uni.hideTabBar();
      
			uni.getSystemInfo({
			  success: function(e) {
			    // #ifndef H5
			    // 获取手机系统版本
			    const system = e.system.toLowerCase()
			    const platform = e.platform.toLowerCase()
			    // 判断是否为ios设备
			    if (platform.indexOf('ios') != -1 && (system.indexOf('ios') != -1 || system.indexOf('macos') != -1)) {
			      Vue.prototype.SystemPlatform = 'apple'
			    } else if (platform.indexOf('android') != -1 && (system.indexOf('android') != -1)) {
			      Vue.prototype.SystemPlatform = 'android'
			    } else {
			      Vue.prototype.SystemPlatform = 'devtools'
			    }
			    // #endif
			  }
			})
      
      // 获取设备的状态栏信息和自定义顶栏信息
      // store.dispatch('updateCustomBarInfo')
      updateCustomBarInfo().then((res) => {
        store.commit('$tStore', {
          name: 'vuex_status_bar_height',
          value: res.statusBarHeight
        })
        store.commit('$tStore', {
          name: 'vuex_custom_bar_height',
          value: res.customBarHeight
        })
      })
			
      // #ifdef H5
      // 在H5环境下，监听页面关闭/刷新事件
      window.addEventListener('beforeunload', (event) => {
        console.log('===== 浏览器即将关闭/刷新，发送离线状态 =====');
        // 尝试发送离线状态（使用防抖版本）
        this.publishOfflineWithDebounce();
        
        // 下面的代码在某些浏览器中可能会触发关闭确认对话框
        // event.preventDefault();
        // event.returnValue = '';
      });
      // #endif
      
      // 获取系统配置
      this.initSystemConfig();
      
      // 初始化获取tabbar配置
      this.initTabbarConfig();
      
      // 初始化登录状态
      this.initLoginStatus();
      
			// #ifdef MP-WEIXIN
			//更新检测
			if (wx.canIUse('getUpdateManager')) {
			  const updateManager = wx.getUpdateManager();
			  updateManager && updateManager.onCheckForUpdate((res) => {
			    if (res.hasUpdate) {
			      updateManager.onUpdateReady(() => {
			        uni.showModal({
			          title: '更新提示',
			          content: '新版本已经准备就绪，是否需要重新启动应用？',
			          success: (res) => {
			            if (res.confirm) {
			              uni.clearStorageSync() // 更新完成后刷新storage的数据
			              updateManager.applyUpdate()
			            }
			          }
			        })
			      })
			
			      updateManager.onUpdateFailed(() => {
			        uni.showModal({
			          title: '已有新版本上线',
			          content: '小程序自动更新失败，请删除该小程序后重新搜索打开哟~~~',
                showCancel: false
			        })
			      })
			    } else {
			      //没有更新
			    }
			  })
			} else {
			  uni.showModal({
			    title: '提示',
			    content: '当前微信版本过低，无法使用该功能，请更新到最新的微信后再重试。',
          showCancel: false
			  })
			}
      // #endif

      // 检查网络状态
      uni.getNetworkType({
        success: (res) => {
          if (res.networkType === 'none') {
            uni.showToast({
              title: '当前无网络连接',
              icon: 'none'
            });
          }
        }
      });
		},
    methods: {
      // 获取系统配置
      async initSystemConfig() {
        try {
          // 从服务器获取系统配置
          await store.dispatch('config/fetchSystemConfig');
        } catch (error) {
          console.error('初始化系统配置失败:', error);
        }
      },
      
      // 初始化获取tabbar配置
      async initTabbarConfig() {
        try {
          // 每次都从服务器获取最新的tabbar配置
          await store.dispatch('fetchTabbarConfig');
        } catch (error) {
          console.error('初始化Tabbar配置失败:', error);
        }
      },
      
      // 初始化登录状态
      async initLoginStatus() {
        try {
          // 检查当前登录状态
          const isLoggedIn = await checkLoginStatus();
          
          if (!isLoggedIn) {
            // 未登录或token已过期，尝试进行自动登录
            // #ifdef MP-WEIXIN
            await this.autoWxLogin();
            // #endif
          } else {
            // 获取用户信息
            try {
              await store.dispatch('user/getUserInfo');
              
              // 登录成功后初始化WebSocket连接
              this.initWebSocket();
            } catch (error) {
              console.error('获取用户信息失败:', error);
            }
          }
        } catch (error) {
          console.error('初始化登录状态失败:', error);
        }
      },
      
      // 微信小程序自动登录
      async autoWxLogin() {
        try {
          // #ifdef MP-WEIXIN
          // 使用全局登录方法，确保全局只有一个登录流程
          const loginResult = await globalAutoLogin();
          
          // 登录成功后初始化WebSocket连接
          if (loginResult) {
            this.initWebSocket();
          }
          // #endif
        } catch (error) {
          console.error('App.vue 微信自动登录失败:', error);
          // 登录失败时可能需要跳转到登录页面，或进行其他处理
          // 此处静默处理错误，不显示提示，不强制要求登录
        }
      },
      
      // 初始化WebSocket连接
      initWebSocket() {
        try {
          const userId = uni.getStorageSync('userId');
          
          if (userId) {
            // 添加消息监听器处理全局通知
            webSocketManager.addListener('app-notification', (message) => {
              this.handleWebSocketMessage(message);
            });
            
            // 初始化WebSocket连接
            webSocketManager.init({
              userId: userId
            });
          } else {
            console.warn('初始化WebSocket失败: 未找到用户ID');
          }
        } catch (error) {
          console.error('初始化WebSocket失败:', error);
        }
      },
      
      // 处理接收到的WebSocket消息
      handleWebSocketMessage(message) {
        try {
          console.log('App.vue接收到WebSocket消息:', message);
          
          // 所有的消息先添加到通知列表中（用于统计未读数量）
          let content = {};
          try {
            // 尝试解析content
            if (typeof message.content === 'string') {
              content = JSON.parse(message.content);
            } else if (typeof message.content === 'object') {
              content = message.content;
            }
          } catch (e) {
            console.error('解析消息内容失败:', e);
            content = { raw: message.content };
          }
          
          // 将消息添加到通知列表
          const notification = {
            id: Date.now(),
            time: new Date().getTime(),
            type: message.type,
            message: message,
            content: content
          };
          
          // 根据消息类型进行不同处理
          if (message.type) {
            switch (message.type) {
              // 处理聊天消息
              case 'im.message.send':
				// 获取当前用户ID
				const currentUserId = parseInt(uni.getStorageSync('userId'));
				
				// 检查消息发送者是否是当前用户自己
				const fromUserId = content.fromUserId || content.senderId;
				
				// 只有当消息不是自己发送的时才显示提示和增加未读计数
				if (fromUserId !== currentUserId) { 
				  // 更新未读消息计数并添加通知
				  this.$store.commit('websocket/INCREMENT_UNREAD_COUNT');
				  this.$store.commit('websocket/ADD_NOTIFICATION', notification);
				  
				  // 显示聊天消息提醒
				  this.showMessageToast(content);
				} else {
				  console.log('收到自己发送的消息，不显示提示也不增加未读计数');
				}
				
                break;
                
              // 处理系统通知
              case 'notice.push':
                // 显示系统通知提醒
                this.showSystemToast(content);
                break;
                
              // 处理在线状态变更
              case 'im.user.online':
                // 可以在这里更新好友列表中的在线状态
                console.log('===== App.vue收到用户在线状态变更消息 =====', message);
                try {
                  const onlineContent = typeof message.content === 'string' ? 
                    JSON.parse(message.content) : message.content;
                  console.log(`===== App.vue处理用户在线状态: ${onlineContent.isOnline ? '在线' : '离线'} =====`);
                  
                  // 这里可以添加更新好友列表在线状态的代码
                  // 例如:
                  // this.updateFriendOnlineStatus(message.userId, onlineContent.isOnline);
                } catch (e) {
                  console.error('===== App.vue解析用户在线状态消息内容失败 =====', e);
                }
                break;
                
              default:
                // 对于其他类型的消息，可以根据需要进行处理
                break;
            }
          }
        } catch (error) {
          console.error('处理WebSocket消息失败:', error);
        }
      },
      
      // 显示聊天消息提示
      showMessageToast(content) {
        try {
          if (content) {
            const senderName = content.fromUserNickname || content.senderName || '新消息';
            
            // 根据消息类型显示不同的提示内容
            let messageContent = '';
            
            // 判断消息类型
            if (content.type === 2 || (content.messageType && content.messageType === 'IMAGE')) {
              // 图片消息
              messageContent = '[图片]';
            } else if (content.type === 3 || (content.messageType && content.messageType === 'VOICE')) {
              // 语音消息
              messageContent = '[语音]';
            } else if (content.type === 4 || (content.messageType && content.messageType === 'VIDEO')) {
              // 视频消息
              messageContent = '[视频]';
            } else if (content.type === 5 || (content.messageType && content.messageType === 'FILE')) {
              // 文件消息
              messageContent = '[文件]';
            } else {
              // 默认为文本消息，显示内容
              messageContent = content.content || content.text || '';
            }
            
            uni.showToast({
              title: `${senderName}: ${messageContent}`,
              icon: 'none',
              duration: 3000
            });
          }
        } catch (error) {
          console.error('显示聊天消息提示失败:', error);
        }
      },
      
      // 显示系统通知提示
      showSystemToast(content) {
        try {
          if (content && content.title) {
            uni.showToast({
              title: content.title,
              icon: 'none',
              duration: 3000
            });
          }
        } catch (error) {
          console.error('显示系统通知提示失败:', error);
        }
      },
      
      // 发送离线状态（不使用防抖）
      publishOfflineWithDebounce() {
        // 直接发送离线状态，不进行时间检查
        if (webSocketManager && webSocketManager.isConnected) {
          console.log('===== 发送离线状态 =====');
          webSocketManager.publishOnlineStatus(false);
        } else {
          console.log('===== WebSocket未连接，无法发送离线状态 =====');
        }
      },
      
      // 发送在线状态（不使用防抖）
      publishOnlineWithDebounce() {
        // 直接发送在线状态，不进行时间检查
        if (webSocketManager && webSocketManager.isConnected) {
          console.log('===== 发送在线状态 =====');
          webSocketManager.publishOnlineStatus(true);
        } else {
          console.log('===== WebSocket未连接，无法发送在线状态 =====');
        }
      }
    },
		onShow: function() {
			console.log('App Show');
			
			// 应用进入前台时，重新连接WebSocket（如果之前已断开）
			if (webSocketManager && !webSocketManager.isConnected) {
			  const userId = uni.getStorageSync('userId');
			  if (userId) {
			    webSocketManager.init({
			      userId: userId
			    });
			  }
			} else if (webSocketManager && webSocketManager.isConnected) {
			  // 如果WebSocket已连接，发送在线状态
			  console.log('===== 应用进入前台，发送在线状态 =====');
			  this.publishOnlineWithDebounce();
			}
		},
		onHide: function() {
			console.log('App Hide - 应用进入后台或即将退出');
			
			// 在微信小程序中，onHide可能是用户退出小程序的最后一个可以触发的事件
			// 所以在这里也尝试发送离线状态（使用防抖版本）
			this.publishOfflineWithDebounce();
		},
    onUnload: function() {
      console.log('App Unload - 应用被销毁');
      
      // 在应用销毁时主动关闭WebSocket连接并发送离线状态
      if (webSocketManager && webSocketManager.isConnected) {
        console.log('===== 应用销毁，主动关闭WebSocket连接 =====');
        webSocketManager.close(true); // 参数为true表示发送离线状态
      }
    },
    // #ifdef MP-WEIXIN
    // 在小程序被关闭时调用
    onError: function(err) {
      console.error('应用发生错误:', err);
    },
    // #endif
	}
</script>

<style lang="scss">
  /* 注意要写在第一行，同时给style标签加入lang="scss"属性 */
  @import './tuniao-ui/index.scss';
  @import './tuniao-ui/iconfont.css';
  @import './tuniao-ui/TnDouble.css';
  /* 图鸟东东温馨提醒：在这里设置全局背景颜色吖*/
  page {
      background-color: #020303;
  }
</style>
